package cn.zzz.openplatform.amap.model.direction;

import cn.hutool.core.annotation.Alias;
import cn.zzz.openplatform.amap.constant.AmapUrlConstant;
import cn.zzz.openplatform.amap.model.AmapOpenApiRequest;
import lombok.*;

/**
 * 驾车路径规划请求参数
 * <a href="https://lbs.amap.com/api/webservice/guide/api/direction#t5">接口文档</a>
 */
@EqualsAndHashCode(callSuper = true)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AmapDrivingDirectionRequest extends AmapOpenApiRequest<AmapDrivingDirectionResponse> {

    /**
     * 出发点
     * 规则：lon,lat（经度,纬度），如117.500244, 40.417801 经纬度小数点不超过6位
     * 必填：是
     */
    private String origin;

    /**
     * 目的地
     * 规则：lon,lat（经度,纬度），如117.500244, 40.417801 经纬度小数点不超过6位
     * 必填：是
     */
    private String destination;

    /**
     * 起点 POI ID
     * 可选：建议在起点为POI时填充此值，可提升路线规划准确性
     */
    @Alias("origin_id")
    private String originId;

    /**
     * 目的地 POI ID
     * 可选：建议在目的地为POI时填充此值，可提升路线规划准确性
     */
    @Alias("destination_id")
    private String destinationId;

    /**
     * 终点的 POI 类别
     * 可选：当用户知道终点 POI 的类别时候，建议填充此值
     */
    @Alias("destination_type")
    private String destinationType;

    /**
     * 驾车选择策略
     * 可选值：
     * 0~9: 返回一条路径规划结果
     * 10~20: 返回多条路径规划结果
     * 默认值：0
     * 必填：否
     */
    private Integer strategy;

    /**
     * 途经点
     * 规则：经度和纬度用","分割，经度在前，纬度在后，小数点后不超过6位，坐标点之间用";"分隔
     * 最大数目：16个坐标点
     * 必填：否
     */
    private String waypoints;

    /**
     * 避让区域
     * 规则：区域避让，支持32个避让区域，每个区域最多可有16个顶点
     * 经度和纬度用","分割，经度在前，纬度在后，小数点后不超过6位，坐标点之间用";"分隔，区域之间用"|"分隔
     * 必填：否
     */
    @Alias("avoid_polygons")
    private String avoidPolygons;

    /**
     * 车牌省份缩写
     * 规则：用汉字填入车牌省份缩写，用于判断是否限行，例如：京
     * 必填：否
     */
    private String province;

    /**
     * 车牌号码
     * 规则：填入除省份及标点之外，车牌的字母和数字（需大写）
     * 支持6位传统车牌和7位新能源车牌
     * 必填：否
     */
    private String number;

    /**
     * 车辆类型
     * 可选值：
     * 0：普通汽车(默认值)
     * 1：纯电动车
     * 2：插电混动车
     * 必填：否
     */
    @Alias("car_type")
    private Integer carType;

    /**
     * 是否使用轮渡
     * 可选值：
     * 0: 使用渡轮(默认)
     * 1: 不使用渡轮
     * 必填：否
     */
    @Alias("ferry")
    private Integer ferry;

    /**
     * 是否返回路径聚合信息
     * 可选值：
     * false: 不返回路径聚合信息
     * true: 返回路径聚合信息，在 steps 上层增加 roads 做聚合
     * 必填：否
     */
    @Alias("road_aggregation")
    private Boolean roadAggregation;

    /**
     * 是否返回 steps 字段内容
     * 可选值：
     * 0: steps 字段内容正常返回
     * 1: steps 字段内容为空
     * 必填：否
     */
    @Alias("no_steps")
    private Integer noSteps;

    @Override
    public Class<AmapDrivingDirectionResponse> getResponseClass() {
        return AmapDrivingDirectionResponse.class;
    }

    @Override
    public String getUrl() {
        return AmapUrlConstant.DRIVING_PATH_PLAN_URL;
    }
}
